#!/bin/bash

fatal() {
    if [ -n "${2}" ]; then
        echo -e "Error: ${2}"
    fi
    exit ${1}
}

usage() {
cat << EOF
Usage: $0 <options>

Request server configuration from Ansible Tower.

OPTIONS:
   -h      Show this message
   -s      Tower server (e.g. https://tower.example.com) (required)
   -k      Allow insecure SSL connections and transfers
   -c      Host config key (required)
   -t      Job template ID (required)
   -e      Extra variables
EOF
}

# Initialize variables
INSECURE=""

# Parse arguments
while getopts “hks:c:t:s:e:” OPTION
do
     case ${OPTION} in
         h)
             usage
             exit 1
             ;;
         s)
             TOWER_SERVER=${OPTARG}
             ;;
         k)
             INSECURE="-k"
             ;;
         c)
             HOST_CFG_KEY=${OPTARG}
             ;;
         t)
             TEMPLATE_ID=${OPTARG}
             ;;
         e)
             EXTRA_VARS=${OPTARG}
             ;;
         ?)
             usage
             exit
             ;;
     esac
done

# Validate required arguments
test -z ${TOWER_SERVER} && fatal 1 "Missing required -s argument"
# Make sure TOWER_SERVER starts with http:// or https://
[[ "${TOWER_SERVER}" =~ ^https?:// ]] || fatal 1 "Tower server must begin with http:// or https://"
test -z ${HOST_CFG_KEY} && fatal 1 "Missing required -c argument"
test -z ${TEMPLATE_ID} && fatal 1 "Missing required -t argument"

# Generate curl --data parameter
if [ -n "${EXTRA_VARS}" ]; then
    CURL_DATA="{\"host_config_key\": \"${HOST_CFG_KEY}\", \"extra_vars\": \"${EXTRA_VARS}\"}"
else
    CURL_DATA="{\"host_config_key\": \"${HOST_CFG_KEY}\"}"
fi

set -o pipefail
HTTP_STATUS=$(curl ${INSECURE} -s -i -X POST -H 'Content-Type:application/json' --data "$CURL_DATA" ${TOWER_SERVER}/api/v1/job_templates/${TEMPLATE_ID}/callback/ 2>&1 | head -n1 | awk '{print $2}')
CURL_RC=$?
if [ ${CURL_RC} -ne 0 ]; then
    fatal ${CURL_RC} "curl exited with ${CURL_RC}, halting."
fi

# Extract http status code
if [[ ${HTTP_STATUS} -ge 300 ]]; then
    fatal 1 "${HTTP_STATUS} received, encountered problem, halting."
else
    echo "Success: ${HTTP_STATUS} received."
fi
